﻿--- Eliminar las funciones existentes sin importar el numero ni tipo de parametros
SELECT * FROM "DropFunction_AWIL"('FuncMaeLocal');
--- crear una nueva funcion
CREATE OR REPLACE FUNCTION "FuncMaeLocal"(
	 IN  	"@OP" CHARACTER VARYING(64)
	,IN  	"@paramAux" TEXT
	,INOUT 	"@id" INTEGER
	,INOUT 	"@fechaGrab" timestamp
	,INOUT 	"@usuarioGrab" character varying(32)
	,INOUT 	"@activo" boolean
	,INOUT 	"@codMaeLocal" character varying(16)
	,INOUT 	"@nombreMaeLocal" character varying(32)
	,INOUT 	"@codMaeCComercial" character varying(32)
	,INOUT 	"@codMaeEmpresa" character varying(16)
	,INOUT 	"@descripcion" character varying(512)
)RETURNS 
	 setof record
AS $$ 
DECLARE
	Auxiliar TEXT;
	pagina INTEGER;
	numRegistrosPorPagina INTEGER;
	campoFiltroOrden character varying(64);
	valorFiltro character varying(64);
BEGIN

	IF "@OP"='selectAll' THEN
		--- obtengo la pagina
		pagina = coalesce(CAST((string_to_array("@paramAux",'|'))[1] as INTEGER),0); 
		--- obtengo el numero de registros por pagina
		numRegistrosPorPagina = coalesce(CAST((string_to_array("@paramAux",'|'))[2] as INTEGER),-1); 
		--- obtengo el campo por el cual se ordenara y filtrara la info
		campoFiltroOrden = coalesce(trim((string_to_array("@paramAux",'|'))[3]),''); 
		--- obtengo el valor con el cual se realizara el filtro (sino se selecciono ningun campo, inicializo el valor con '')
		valorFiltro = CASE WHEN campoFiltroOrden='' THEN '' ELSE coalesce(trim((string_to_array("@paramAux",'|'))[4]),'') END;

		if valorFiltro<>'' THEN
			IF campoFiltroOrden = 'activo' THEN
				--- si se selecciono el campo "activo", formateo el campo valor (true, false)
				valorFiltro=CASE WHEN lower(valorFiltro)='si' OR lower(valorFiltro)='s' THEN 'true'  WHEN lower(valorFiltro)='no' OR lower(valorFiltro)='n' THEN 'false' ELSE '' END;
			ELSE
				--- si se definio un valor para filtrar, le agrego los caracteres de comodin para que la busqueda sea mas flexible
				valorFiltro= '%' || valorFiltro || '%';
			END IF;
				
		END IF;
		
		--- con esta sentencia muestro todos los resultados de la tabla
		if numRegistrosPorPagina < 0 then 
			numRegistrosPorPagina = 1000000;
		end if;

		
		RETURN	QUERY 
		SELECT	"id", "fechaGrab", "usuarioGrab", "activo", "codMaeLocal", "nombreMaeLocal", "codMaeCComercial", "codMaeEmpresa", "descripcion" 
		FROM	
			"MaeLocal"
		WHERE
			(valorFiltro<>'' AND campoFiltroOrden='codMaeLocal' AND "codMaeLocal" ILIKE valorFiltro)
			OR
			(valorFiltro<>'' AND campoFiltroOrden='nombreMaeLocal' AND "nombreMaeLocal" ILIKE valorFiltro)
			OR
			(valorFiltro<>'' AND campoFiltroOrden='codMaeCComercial' AND "codMaeCComercial" ILIKE valorFiltro)
			OR
			(valorFiltro<>'' AND campoFiltroOrden='codMaeEmpresa' AND "codMaeEmpresa" ILIKE valorFiltro)
			OR
			(valorFiltro<>'' AND campoFiltroOrden='activo' AND "activo" = CAST(valorFiltro AS BOOLEAN))
			OR
			(valorFiltro<>'' AND campoFiltroOrden='descripcion' AND "descripcion" ILIKE valorFiltro)
			OR
			valorFiltro=''
		ORDER BY 
			CASE
				WHEN campoFiltroOrden='codMaeLocal' THEN "codMaeLocal"
				WHEN campoFiltroOrden='codMaeCComercial' THEN "codMaeCComercial"
				WHEN campoFiltroOrden='nombreMaeLocal' THEN "nombreMaeLocal"
				WHEN campoFiltroOrden='codMaeEmpresa' THEN "codMaeEmpresa"
				WHEN campoFiltroOrden='activo' THEN CAST("activo" AS  character varying(1))
				WHEN campoFiltroOrden='descripcion' THEN "descripcion"
			END ASC
		       ,"id" ASC
		LIMIT 
			numRegistrosPorPagina 
		OFFSET 
			numRegistrosPorPagina * pagina;
		RETURN;
	END IF;

	IF "@OP"='insert' THEN

		--- Verifico que no exista  con ese CODIGO
		IF EXISTS (SELECT 1 FROM "MaeLocal" WHERE "codMaeLocal"="@codMaeLocal") THEN
			Auxiliar = 'Ya existe un Local con el codigo "' || "@codMaeLocal" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que no exista con ese NOMBRE
		IF EXISTS (SELECT 1 FROM "MaeLocal" WHERE "nombreMaeLocal"="@nombreMaeLocal") THEN
			Auxiliar = 'Ya existe un Local con el Nombre "' || "@nombreMaeLocal" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		-- Grabo el registro
		INSERT INTO "MaeLocal" ("usuarioGrab","usuarioUltMod","activo","codMaeLocal","nombreMaeLocal", "codMaeCComercial", "codMaeEmpresa", "descripcion")
		VALUES	 ("@usuarioGrab","@usuarioGrab",coalesce("@activo",TRUE), "@codMaeLocal", "@nombreMaeLocal", "@codMaeCComercial", "@codMaeEmpresa", "@descripcion");
		
		--- retorno el ultimo registro insertado
		RETURN QUERY SELECT "id", "fechaGrab", "usuarioGrab", "activo", "codMaeLocal", "nombreMaeLocal", "codMaeCComercial", "codMaeEmpresa", "descripcion" FROM "MaeLocal" ORDER BY "id" DESC LIMIT 1;
			
		RETURN;
	RETURN;
	END IF;

	IF "@OP"='selectById' THEN
		RETURN	QUERY 
		SELECT	"id", "fechaGrab", "usuarioGrab", "activo", "codMaeLocal", "nombreMaeLocal", "codMaeCComercial", "codMaeEmpresa", "descripcion"
		FROM	"MaeLocal" 
		WHERE	"id"="@id";
		RETURN;
	END IF;

	IF "@OP"='update' THEN

		--- Actualizo el registro
		UPDATE	
			"MaeLocal" 
		SET	
			 "activo"=coalesce("@activo","activo")
			,"fechaUltMod" = NOW() 
			,"usuarioUltMod" = "@usuarioGrab" 
			,"codMaeLocal" = "@codMaeLocal"
			,"nombreMaeLocal" = "@nombreMaeLocal"
			,"codMaeCComercial" = "@codMaeCComercial"
			,"codMaeEmpresa" = "@codMaeEmpresa"
			,"descripcion" = "@descripcion"
					
		WHERE	
			"id" = "@id";

	RETURN;
	END IF;

	IF "@OP"='delete' THEN

		--- Borro el registro
		DELETE FROM "MaeLocal" 
		WHERE "id" = "@id";

	RETURN;
	END IF;

--- Controlo que se haya digitado el OP correctamente
IF "@OP" IS NOT NULL THEN
	Auxiliar = 'El OP "' || "@OP" || '" No existe, verifique.';
	RAISE EXCEPTION '%', Auxiliar;
RETURN;
END IF;
END;
$$ LANGUAGE 'plpgsql';

